package pwd.allen.export.cellDataUpdater;

import org.jxls.command.CellDataUpdater;
import org.jxls.common.CellData;
import org.jxls.common.CellRef;
import org.jxls.common.Context;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * UpdateCell命令允许你自定义处理特定单元格
 * 该命令的属性有：
 *      updater：Context中CellDataUpdater实现的键名。
 *      lastCell：命令体区域的最后一个单元格
 * 实例：jx:updateCell(lastCell="E4" updater="myCellDataUpdater")
 *
 * @author lenovo
 * @create 2019-10-11 10:35
 **/
public class MyCellDataUpdater implements CellDataUpdater {

    // 正则表达式，判断是否是SUM(E数字)
    private static final Pattern regex = Pattern.compile("MYSUM\\((\\w+)(\\d+)\\)");

    /**
     *  TODO 备注下各个入参是什么意思  如何给单元格赋值
     *  问题：
     *  $[SUM(B2)]在xlsx表格中显示0，需要点击公式后才显示正确值
     * @param cellData
     * @param cellRef
     * @param context
     */
    @Override
    public void updateCellData(CellData cellData, CellRef cellRef, Context context) {
        // 如果是SUM(列行)，则统计该单元格到当前单元格的汇总
        if (cellData.isFormulaCell()) {
            Matcher matcher = regex.matcher(cellData.getFormula());
            if (matcher.find()) {
                String col = matcher.group(1);
                String row = matcher.group(2);
                String resultFormula = String.format("SUM(%s%s:%s%d)", col, row, col, cellRef.getRow());
                cellData.setEvaluationResult(resultFormula);
            }
        } else {
            System.out.println(cellData.getCellValue());
        }
    }
}
